/***************************** Ccay IGrid statusBar *************************************/
/**
 * @description igrid 数据状态bar
 * 
 * @since 2013-7-18
 */
(function(IGrid) {
	var statusBar = {
		build: function (grid, op){
			// 数据仓库中添加各个操作的代理方法
			var trigger = op.Storage.Trigger;
			// 新增
			trigger.insert.add(function(item){
				item._newIndex && statusBar.updateStatus(grid, op, "inserted");
    		});
    		// 更新
    		trigger.update.add(function(){
    			statusBar.updateStatus(grid, op, "updated");
    		});
    		// 删除
    		trigger.remove.add(function(){
    			statusBar.updateStatus(grid, op/*,"deleted"*/);
    		});
    		// 只清除(新增数据,直接新增无其他操作)时
    		op.Storage.insertStorage && 
    			op.Storage.insertStorage.Trigger.destroy.add(function(item){
    				item._inserted && statusBar.updateStatus(grid, op);
    			});
		},
		// 绑定事件
		bindEvent:function(grid, op){
			grid.getMiniToolBar().delegate(".igrid-status","click",function(){
				//$(this).attr("name") 区分传递的各个状态参数
				statusBar.openPopup(grid, op, $(this).attr("name"));
			})
		},
		// 创建tab
		buildTab: function(newOp, popElem){
			popElem.tab = $.create("div","igrid-status-tab");
			var tabItem = [];
			for(var i in newOp._showStatus){
				tabItem.push('<div title="{0}" tabid="{1}"></div>'.formatValue($i18n("ccay.common.igrid."+ i +"status"),i));
			};
			popElem.popDiv.append(popElem.tab.append(tabItem.join("")));
		},
		// 创建toolbar
		buildToolBar: function(grid, newOp, popElem){
			popElem.toolbar = $.create("div",null,"igrid-status-toolbar");
			var items = [],
				operation = grid.op.operation;
			if(operation){
				// 焦点移出igrid点击的button，不可见
				items.push({type:"html",
						htmlContent:"<input type='button' id='igrid-status-focus' class='igrid-status-focus'/>"
				});
				// 标识为删除
				operation.del && operation.del.btn && items.push(
					{
						type:"imgBtn",
						icon: "pre-del",
						text:"ccay.common.button.gridDelete",
						attr:{
							id : "igrid-status-delBtn"
						}
					}
				);
				// 取消删除
				operation.del && operation.del.undoBtn && items.push(
					{
						type:"imgBtn",
						icon: "undel",
						text:"ccay.common.button.gridUndoDelete",
						attr:{
							id : "igrid-status-undoDelBtn"
						}
					}
				);
				// 保存
				operation.save && operation.save.btn && items.push(
					 {
						type:"imgBtn",
						icon: "save",
						text:"ccay.common.button.gridSave",
						click:function(){
							statusBar.inputFocus();
							setTimeout(function(){
								statusBar.closePopup(grid, popElem.newGrid.manager(), newOp);
								$(operation.save.btn).click();
							},400);
						}
					}
				);
				// 返回继续编辑
				items.push(
					{
						type:"imgBtn",
						icon: "back",
						css:"default",//特殊样式
						text:"ccay.common.igrid.statusback",
						click:function(){
							statusBar.inputFocus();
							setTimeout(function(){
								statusBar.closePopup(grid, popElem.newGrid.manager(), newOp);
							},400);
						}
					}
				);
			};
			// 关闭图标
			items.push({
				type:"img", // 图标类型
				icon: "dialog-close", // 图标名称
				css:"igrid-status-close",
				text:"ccay.common.igrid.statusback", // 图标title
				// 图标事件，click可为字符串和function，onClick只能为字符串
				click:function(){
					$("#igrid-status-focus").click();
					setTimeout(function(){
						statusBar.closePopup(grid, popElem.newGrid.manager(), newOp);
					},400);
				} 
			});
			popElem.toolbar.ccayToolbar({
				items:items,
				hasItemDiv:false,
				fnComplete:function(){
					popElem.popDiv.append(popElem.toolbar);
					operation && operation.del && (newOp.operation = {
						del : {
							btn: "#igrid-status-delBtn",
							undoBtn: "#igrid-status-undoDelBtn"
						}
					})
				}
			});
		},
		// 创建grid
		buildGrid: function(grid, newOp, operation, popElem){
			var newGridId = grid.dom.id() + "-status";
			popElem.newGrid = $.create("div",null,newGridId);
			popElem.popDiv.append(popElem.newGrid);
			// igrid初始化完成后初始化tab
			newOp.fnInitComplete = function(){
				// 设置延时防止tab的宽度未知呆滞出现左右按钮
				setTimeout(function(){
					popElem.tab.ccayTab({
						defaultItemId : operation,
						fnBeforeSelectItem : function(){
							var newGridMag = popElem.newGrid.manager();
							newGridMag.valid();
							newGridMag.clearActiveEditor();
						},
						fnAfterSelectItem:function(tabid){
							// 选择tab后，数据填充
							var records =  newOp._showStatus[tabid].getRecord(grid),
								newGridMag = popElem.newGrid.manager();
							newGridMag.setValue(records,false);
							if (tabid == "error" && records.length && grid.op._errorMsg) {
								statusBar.showErrorMsg(newGridMag, records, grid.op._errorMsg);
							}
						}
					});
				}, 10)
			};
			
		},
		// 创建弹出框的内容
		buildPopup: function(grid, newOp, operation){
			// 生成弹出框对象
			var popElem = {popDiv : grid.getBottom().children(".ccay-igrid-status")};
			if(popElem.popDiv.length < 1){
				popElem.popDiv =  $.create("div","ccay-igrid-status");
				// tab
				statusBar.buildTab(newOp, popElem);
				// toolbar
				statusBar.buildToolBar(grid, newOp, popElem);
				// grid
				statusBar.buildGrid(grid, newOp, operation, popElem);
				// 盖住层
				popElem.overlay = $.create("div","ccay-igrid-overlay");
				// 若有弹出框，z-index的处理,获得最大的z-index
				var lastDialog = $(".ccay-dialog.ccay-popup:last");
				if(lastDialog.length){
					var maxZindex = lastDialog.css("z-index") * 1;
					popElem.overlay.css("z-index", maxZindex + 10);
					popElem.popDiv.css("z-index", maxZindex + 20);
				};
				grid.getBottom().append(popElem.overlay).append(popElem.popDiv);
				// 初始化grid
				popElem.newGrid.igrid(newOp);
				grid.op._initStatusBar = false;
			}else{
				grid.op._initStatusBar = true;
			}
			
			// 高宽控制
			var gridWidth = grid.dom.width(),
				gridHeight = grid.dom.height();
			// popup div
			popElem.popDiv.width(gridWidth);
			var newGrid = $("#" + grid.id + "-status");
			// grid
			newGrid.width(gridWidth);
			// grid body
			$(".ccay-igrid-body", newGrid).css({
				//42为减去弹出框的头尾部
				"height" : gridHeight - 42,
				// 无高度限制，以父的高为主
				"min-height" : "",
				"max-height" : ""
			});
			// 盖住层
			$(".ccay-igrid-overlay").show();
			
			// 选中对应的tab项
			grid.op._initStatusBar && $(grid.dom).find(".igrid-status-tab").manager().selectItem(operation);
			
			return popElem.popDiv;
		},
		// 弹出框.包含各个状态的数据
		openPopup : function(grid, op, operation){
			//grid.valid();
			// 关闭父编辑器
			grid.clearActiveEditor();
			// 合并storage
			grid.op.Storage.mergeNewData(!op._requesting, op);
			// 复制原始的op
			var newOp = $.extend(true, {}, grid.dom.data("defGridOp"));
			// 弹出的igrid的op处理
			statusBar.changeOp(grid, newOp);
			// 构建弹出框,若已存在则弹出,否则生成后弹出
			var	popDiv = statusBar.buildPopup(grid, newOp, operation);
			// pop的形式盖住原来的grid区, dom规范grid的父div的class应为"ccay-grid"，若无，则需盖住其本身
			var pos = grid.dom,
				domParent = pos.parent();
			if(domParent.hasClass("ccay-grid")){
				pos = domParent;
			};
			// 父grid是否全屏判断
			var css;
			$(grid.op.fullPanel).hasClass("ccay-fullscreen-full") && (css = {left:"0px",top:"0px"}) ; 
			// 弹出
			Ccay.UI.popup(pos, popDiv, css);
		},
		// 显示错误信息
		showErrorMsg: function (errorGrid, records, errorMsg) {
			var errorField, errorCell;
			$.each(records, function (rIdx, record) {
				errorField = record._errorNo && errorMsg[record._errorNo];
				if (errorField) {
					for (var errorName in errorField) {
						if (errorName != "length" && errorField[errorName]) {
							// 获取单元格
							errorCell = errorGrid.getCellByField(record._index, errorName);
							// 给单元格添加tip标示以及背景色
							errorCell.addClass("grid-tip igrid-servervalid-error").attr("tip", errorField[errorName]);
						}
					}
				}
			});
		},
		// op处理
		changeOp : function(grid, newOp){
			statusBar.changeShowStatus(newOp);
			// 得到原始的operation后，将其置为null
			if(newOp.operation && newOp.operation.del){
				newOp._operation = $.extend(true,{},newOp.operation);
			};
			$.extend(newOp,{
				showStatus : false,
				customSetting : false,
				colsort : false,
				toolPanel : null,
				fullPanel : null,
				showPager : false,
				rowCodeBegin : [],
				rowCodeEnd : [],
				autoLoad : false,
				allowResize : false,
				allowSort : false,
				showTip : true,
				operation:null,
				rowRender:null,
				rowRenderOp:null,
				allowFilter:false,
				fnComplete:function(){
					/*var trigger = this.op.Storage.Trigger;
					// 对缓存模式的取消删除处理,子grid的操作后父grid也要操作
					if(grid.op._cache){
						trigger.remove.add(function(item, delStatus, args){
							grid.op.Storage.removeItem(item, delStatus);
						});
						
						trigger.update.add(function(item,change,value,args){
							grid.op.Storage.updateItem(item,change,value);
						});
					}*/
					// 把父的storage赋给子
					if(grid.op._cache){
						this.op.Storage.Cache.Caches = grid.op.Storage.Cache.Caches;
					}
				}
			})
			// 重新初始化时，清除序号列
			if (newOp.showSeq && newOp.columns && newOp.columns[0]._ctype == "Seq") {
				newOp.columns.shift();
			};
			// 若有删除操作配置时
			if(newOp._operation && newOp._operation.del){
				newOp.operation = {
					del : {
						btn: "#igrid-status-delBtn",
						undoBtn: "#igrid-status-undoDelBtn"
					}
				}
			};
			// 获得原始的编辑完成事件
			var fnEndEdit = newOp.fnEndEdit;
			// 弹出igrid的编辑完成事件处理
			newOp.fnEndEdit = function (value, rowData, td, col, oldValue) {
				statusBar.fnEndEditSetting(value, rowData, td, col, oldValue, grid, fnEndEdit);
			};
			// 存取弹出框的各个元素
			newOp._popDom = {};
		},
		// showStatus项设置处理
		changeShowStatus:function(op){
			// 状态项，可指定扩展[ Array] ，否则默认四种状态
			if(op.showStatus == true){
				op._showStatus = Ccay.UI.IGrid.statusItems;
			}else if($.isArray(op.showStatus)){
				var temp={};
				for(var i = 0,item; item = op.showStatus[i]; i++){
					if(typeof item == "string"){
						var me = Ccay.UI.IGrid.statusItems[item];
						me && (temp[item] = me);
					}else{
						temp[item.name] = {getRecord:item.getRecord, link:item.link};
					}
				};
				op._showStatus = temp;
			}
			return op;
		},
		// 关闭弹出框
		closePopup : function(grid, newGrid, op){
			// 父grid重新加载数据
			grid.reload(null, grid.op._cache, true);
			setTimeout(function(){
				// 弹出的grid清空值
				newGrid.setValue([], false);
				// 隐藏遮罩和弹出框
				$(".ccay-igrid-status, .ccay-igrid-overlay").hide();
			}, 50);
		},
		// 更新全部数据状态
		updateStatus : function(grid, op, status){
			var item, record, statusObj;
			for(var i in op._showStatus){
				// 状态项
				item = status ? op._showStatus[status] :op._showStatus[i];
				// 状态JQ对象
				statusObj = status ? grid.getStatus(status) :grid.getStatus(i);
				// 存在定义改状态时，更新
				if(item && statusObj.length){
					// 状态的数据项
					record = item.getRecord(grid);
					// 更新状态
					statusBar.updateStatusItem(statusObj, record);
					// 更新关联状态
					statusBar.updateLinkStatus(grid, op, item.link);	
				}
				// 指定状态时，跳出循环
				if(status){
					break;
				}
			}
		},
		// 更新单个数据状态
		updateStatusItem : function(statusItem,records){
			if(records.length > 0){
				statusItem.text(records.length).addClass("show");
			}else{
				statusItem.removeClass("show");
			};
		},
		// 更新关联状态
		updateLinkStatus:function(grid, op, link){
			var item, statusObj;
			link && $.each(link, function(i,value){
				item = op._showStatus[value];
				statusObj = grid.getStatus(value);
				item && statusBar.updateStatusItem(statusObj, item.getRecord(grid));
			})
		},
		// 焦点移出igrid的编辑 处理，防止数据丢失
		inputFocus:function(){
			$("#igrid-status-focus").click();
		},
		// fnEndEdit处理，编辑完对错误信息集合的处理
		fnEndEditSetting : function(value, rowData, td, col, oldValue, grid, fnEndEdit){
			// 获得错误信息标志
			var errorMsg = grid.op._errorMsg,
				// 判断当前行是否是错误行
				errorField = rowData && rowData._errorNo && errorMsg[rowData._errorNo];
			// 当前错误单元格中有数据时
			if (errorField && value != oldValue && errorField[col.field]) {
				// 则将错误长度－1
				errorField.lenght--;
				// 并清除错误信息
				errorField[col.field] = null;
				// 去除单元格的样式以及tip提示标示
				td.removeClass("grid-tip igrid-servervalid-error").removeAttr("tip");
				// 若全部错误都清除，则将这行错误信息清除，并清除数据的错误号
				if (!errorField.lenght) {
					errorMsg[rowData._errorNo] = null;
					rowData._errorNo = null;
				} 
			};
			// 执行原来的编辑完成事件
			fnEndEdit && fnEndEdit.call(this, value, rowData, td, col, oldValue);
		}
	};

	/** 注册statusBar插件 */
	Ccay.UI.XControl.addPlugin("XGrid", "statusBar", {
		miniToolBar: function (grid, op, toolBarButton) {
			if(op.showStatus){
				// showStatus项设置处理
				statusBar.changeShowStatus(op);
				
				!op._reIniting && statusBar.build(grid, op);
				// 添加个性化图标按钮到工具栏中
				for(var i in op._showStatus){
					toolBarButton.push({
						type:"html", 
						htmlContent:"<span class='igrid-status {0}' name='{1}' title='{2}'>0</span>".formatValue(i, i, $i18n("ccay.common.igrid."+ i +"status"))
					})
				};
				var fnEndEdit = op.fnEndEdit;
				op.fnEndEdit = function(value, rowData, td, col, oldValue){
					statusBar.fnEndEditSetting(value, rowData, td, col, oldValue, grid, fnEndEdit);
				};
				// 初始化完成后，绑定事件 & 更新数据状态
				op.handler.complete.add(function(){
					statusBar.bindEvent(grid,op);
					statusBar.updateStatus(grid,op);
				});
				op.handler.afterBindData.add(function(grid, op){
					statusBar.updateStatus(grid,op);
				});
			}
		}
	});
			
	/** manager扩展 */
	Ccay.UI.XControl.extendIManager("XGrid", {
		getStatus : function(status){
			return this.getMiniToolBar().children(".igrid-status."+status);
		},
		// 指定更新status状态，无参数时更新全部
		updateStatus : function(status){
			return statusBar.updateStatus(this,this.op,status);
		},
		// 指定状态弹出,无参数时选择第一个tab项
		popupStatus :function(status){
			return statusBar.openPopup(this, this.op, status);
		}
	});

})(Ccay.UI.IGrid);

// 系统默认4种数据状态
// 设置参数指定如:["inserted","deleted",{name:"xxx",getRecord:function(){},link:["inserted"]}]
Ccay.UI.IGrid.statusItems = {
	"inserted" : {
		getRecord : function(grid) {
			return grid.getInsertedRecords()
		}
	},
	"deleted" : {
		getRecord : function(grid) {
			return (grid.getDeletedRecords())
					.concat(grid.op.Storage.getPreDeletedRecords())
		},
		link : ["inserted","updated"] // 删除操作时，对新增和更新的数据状态关联
	},
	"updated" : {
		getRecord : function(grid) {
			return grid.getUpdatedRecords()
		}
	},
	"error" : {
		getRecord : function(grid) {
			return grid.getErrorRecords()
		}
	}
};

